package com.aspire.aimini.repository;

import com.aspire.aimini.model.entity.User;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 用户数据访问层
 *
 * @author wangguiyou
 * @date 2024-12-19
 * @description 用户数据访问接口，继承MyBatis Plus BaseMapper
 */
@Mapper
public interface UserRepository extends BaseMapper<User> {

        /**
         * 根据用户名查询用户
         *
         * @param username 用户名
         * @return 用户信息
         */
        @Select("SELECT * FROM user WHERE username = #{username} AND is_deleted = 0")
        User findByUsername(@Param("username") String username);

        /**
         * 根据邮箱查询用户
         *
         * @param email 邮箱
         * @return 用户信息
         */
        @Select("SELECT * FROM user WHERE email = #{email} AND is_deleted = 0")
        User findByEmail(@Param("email") String email);

        /**
         * 根据手机号查询用户
         *
         * @param phone 手机号
         * @return 用户信息
         */
        @Select("SELECT * FROM user WHERE phone = #{phone} AND is_deleted = 0")
        User findByPhone(@Param("phone") String phone);

        /**
         * 更新用户最后登录信息
         *
         * @param userId    用户ID
         * @param loginTime 登录时间
         * @param loginIp   登录IP
         * @return 更新行数
         */
        @Update("UPDATE user SET last_login_time = #{loginTime}, last_login_ip = #{loginIp} WHERE id = #{userId}")
        int updateLastLoginInfo(@Param("userId") Long userId,
                        @Param("loginTime") LocalDateTime loginTime,
                        @Param("loginIp") String loginIp);

        /**
         * 分页查询用户列表（自定义查询）
         *
         * @param page            分页对象
         * @param username        用户名（模糊查询）
         * @param nickname        昵称（模糊查询）
         * @param email           邮箱（模糊查询）
         * @param phone           手机号（模糊查询）
         * @param role            角色
         * @param status          状态
         * @param createTimeStart 创建时间开始
         * @param createTimeEnd   创建时间结束
         * @return 分页结果
         */
        IPage<User> selectUserPage(Page<User> page,
                        @Param("username") String username,
                        @Param("nickname") String nickname,
                        @Param("email") String email,
                        @Param("phone") String phone,
                        @Param("role") String role,
                        @Param("status") Integer status,
                        @Param("createTimeStart") LocalDateTime createTimeStart,
                        @Param("createTimeEnd") LocalDateTime createTimeEnd);

        /**
         * 根据角色查询用户列表
         *
         * @param role 角色
         * @return 用户列表
         */
        @Select("SELECT * FROM user WHERE role = #{role} AND is_deleted = 0 AND status = 1")
        List<User> findByRole(@Param("role") String role);

        /**
         * 统计用户数量
         *
         * @param status 状态（可选）
         * @return 用户数量
         */
        @Select("<script>" +
                        "SELECT COUNT(*) FROM user WHERE is_deleted = 0" +
                        "<if test='status != null'> AND status = #{status}</if>" +
                        "</script>")
        Long countUsers(@Param("status") Integer status);

        /**
         * 批量更新用户状态
         *
         * @param userIds 用户ID列表
         * @param status  状态
         * @return 更新行数
         */
        @Update("<script>" +
                        "UPDATE user SET status = #{status} WHERE id IN" +
                        "<foreach collection='userIds' item='id' open='(' separator=',' close=')'>" +
                        "#{id}" +
                        "</foreach>" +
                        "</script>")
        int batchUpdateStatus(@Param("userIds") List<Long> userIds, @Param("status") Integer status);
}